package org.suanfaTranning.ST200_Chatpter1_LineTable_HashTable_String.array;

/**
 * @Auther: qingle
 * @Date: 2024/9/5-0:38
 * @Description:
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 *
 * 函数 myAtoi(string s) 的算法如下：
 *
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −2^31 的整数应该被舍入为 −2^31 ，大于 2^31 − 1 的整数应该被舍入为
 * 2^31 − 1 。
 *
 * @version: 1.0
 */
public class Solution1 {
	public int myAtoi(String s) {
		if (s == null || s.length() == 0) return 0;

		int i = 0;
		int n = s.length();
		// 丢弃前导空格
		while (i < n && s.charAt(i) == ' ') {
			i++;
		}

		// 检查符号
		boolean isNegative = false;
		if (i < n && (s.charAt(i) == '-' || s.charAt(i) == '+')) {
			isNegative = s.charAt(i) == '-';
			i++;
		}

		// 转换数字
		int result = 0;
		while (i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
			int digit = s.charAt(i) - '0';

			// 检查是否超出32位整数范围,
			/**
			 * A constant holding the minimum value an {@code int} can
			 * have, -2<sup>31</sup>.
			 */

			// Check for integer overflow
			if (result > Integer.MAX_VALUE / 10 ||
			    (result == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10)) {
			    // If overflow occurs, return the minimum or maximum value of Integer based on the sign
			    return isNegative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
			}

			result = result * 10 + digit;
			i++;
		}

		// 舍入
		if (isNegative) {
			return result == 0 ? Integer.MIN_VALUE : -result;
		} else {
			return result;
		}
	}

	public static void main(String[] args) {
		Solution1 solution = new Solution1();
		String test = "42";
		System.out.println(solution.myAtoi(test)); // 输出: 42

		test = "-42";
		System.out.println(solution.myAtoi(test)); // 输出: -42

		test = "   -42";
		System.out.println(solution.myAtoi(test)); // 输出: -42

		test = "4193 with words";
		System.out.println(solution.myAtoi(test)); // 输出: 4193

		test = "words and 987";
		System.out.println(solution.myAtoi(test)); // 输出: 0

		test = "-91283472332";
		System.out.println(solution.myAtoi(test)); // 输出: -2147483648

		test = "9223372036854775807";
		System.out.println(solution.myAtoi(test)); // 输出: 2147483647
	}
}